package cn.itcast.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    /**
     * @LoadBalanced 注解为 RestTemplate Bean添加了一个 LoadBalancerInterceptor 拦截器。
     * @LoadBalanced 采用的是轮训的方式进行服务调用。
     *
     * 为什么加了 @LoadBalanced 就可用通过 Eureka 集群中的服务名称，并可以实现负载均衡呢？
     *
     * 因为 Spring Cloud 给我们做了大量的底层工作，因为它将这些都封装好了。
     *
     * 这里主要的逻辑就是给 RestTemplate 增加拦截器，在请求之前对请求的地址进行替换，或者根据具体的负载策略选择服务地址，然后再去调用。
     * 也就是将localhost：8080转成了Eureka的application的名称。所以没有加该注解则会报：eureka I/O error on GET request for "http://xxxservice/user/1": xxxservice;。
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}